from django.contrib.auth import authenticate, login, logout as out
from django.contrib.auth.models import User
from django.db import IntegrityError
from django.shortcuts import render, redirect

# Create your views here.
# 类视图 定义两个不同的方法处理两种不同的请求方式
# 类视图以请求方式为类方法 在对应的方式下编写对应的逻辑代码
# 自定义的类为普通类，成为视图类，继承
from django.views import View

from user.forms import UserLRFrom


class UserView(View):
    # get类方法处理地址的get请求
    def get(self, request):
        # 还没有页面可以给用户
        form = UserLRFrom()
        return render(request, 'user/register.html', {'form': form})

    def post(self, request):
        form = UserLRFrom(request.POST)
        if form.is_valid():
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            try:
                user = User(username=username)
                # 密码要做加密
                user.set_password(password)
                user.save()
            except IntegrityError:
                message = "用户名已经存在，请重新输入"
            else:
                message = '注册成功'
        return render(request, 'user/register.html', context={"message": message})


class LoginView(View):
    def get(self, request):
        # get请求的时候获取页面数据，需要把表单返回给到模版进行渲染
        # 创建表单对象
        form = UserLRFrom()
        # 把表单对象传输给到模版 前端进行渲染的操作
        return render(request, 'user/login.html', {'form': form})

    def post(self, request):
        # 创建表单对象 需要绑定用户在表单填写的数据，让表单对象帮我们完成校验
        form = UserLRFrom(request.POST)
        # is_valid()校验数据
        if form.is_valid():
            # 获取通过校验后的数据
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            # 验证用户名跟密码是否正确 校验通过
            # user = User.objects.get(username=username)
            # user.check_password(password)
            # 如果正确的话 会返回一个用户对象 否则则会返回一个空值
            user = authenticate(username=username, password=password)
            # 用户是否存在
            if user:
                # 把登录的用户信息放到请求对象中
                # 生成新的或者更新用户会话（session）
                # 登录的用户信息放到请求对象中 绑定到request.user 后续的请求get post通过request来获取登录的用户
                # 处理会话的安全设置 超时时间
                # 必须要先通过authenticate验证
                login(request, user)
                # 获取地址栏中的next参数保存的地址值
                # GET请求 get通过键获取值
                next_url = request.GET.get('next')
                # 后面是否有next参数 发布页的地址路由保存到next参数里面
                if next_url:
                    return redirect(next_url)
                return redirect('index')

            # 校验用户填写的数据跟数据库里面保存的是否一致
            # try:
            #     user = User.objects.get(username=username)
            # except User.DoesNotExist:
            #     message = "账号不存在，请注册后登录"
            # else:
            #     # 校验用户的密码是否正确
            #     if user.check_password(password):
            #         # 账号密码正确 创建session信息，做会话维持
            #         # 将用户名信息存贮在session表里面 通过键添加值
            #         request.session['username'] = username
            #         # 添加过期时间 过期时间单位为秒
            #         # request.session.set_expiry(300)
            #         return redirect('index')
            #         # return render(request,'demo/index.html')
            #     else:
            #         message = "密码错误"
        return render(request, 'user/login.html', )


def logout(request, **kwargs):
    # 退出账号
    # request.session.flush()
    # 调用auth系统的out方法来退出登录 把请求对象用登录用户信息给清除掉
    # 必须要先通过authenticate验证
    out(request)
    return redirect('login')
